package cn.iocoder.yudao.module.crossborder.platform.job.config;

import cn.iocoder.yudao.framework.quartz.config.XxlJobProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 定时任务配置验证器
 * 在应用启动完成后验证定时任务配置是否正确
 *
 * @author 芋道源码
 */
@Component
@Slf4j
public class JobConfigValidator {

    @Resource
    private XxlJobProperties xxlJobProperties;

    /**
     * 应用启动完成后验证配置
     */
    @EventListener(ApplicationReadyEvent.class)
    public void validateJobConfig() {
        log.info("开始验证定时任务配置...");

        try {
            // 验证 XXL-Job 基础配置
            validateXxlJobConfig();
            
            log.info("定时任务配置验证完成 ✅");
        } catch (Exception e) {
            log.error("定时任务配置验证失败 ❌", e);
        }
    }

    /**
     * 验证 XXL-Job 配置
     */
    private void validateXxlJobConfig() {
        if (xxlJobProperties == null) {
            throw new IllegalStateException("XXL-Job 配置属性未加载");
        }

        // 验证启用状态
        if (!xxlJobProperties.getEnabled()) {
            log.warn("⚠️ XXL-Job 未启用，定时任务将无法正常工作");
            return;
        }

        // 验证管理中心配置
        if (xxlJobProperties.getAdmin() == null) {
            throw new IllegalStateException("XXL-Job 管理中心配置缺失");
        }

        String adminAddresses = xxlJobProperties.getAdmin().getAddresses();
        if (adminAddresses == null || adminAddresses.trim().isEmpty()) {
            throw new IllegalStateException("XXL-Job 管理中心地址未配置");
        }

        // 验证执行器配置
        if (xxlJobProperties.getExecutor() == null) {
            throw new IllegalStateException("XXL-Job 执行器配置缺失");
        }

        String appName = xxlJobProperties.getExecutor().getAppName();
        if (appName == null || appName.trim().isEmpty()) {
            throw new IllegalStateException("XXL-Job 执行器应用名未配置");
        }

        String logPath = xxlJobProperties.getExecutor().getLogPath();
        if (logPath == null || logPath.trim().isEmpty()) {
            throw new IllegalStateException("XXL-Job 执行器日志路径未配置");
        }

        // 验证访问令牌
        String accessToken = xxlJobProperties.getAccessToken();
        if (accessToken == null || accessToken.trim().isEmpty()) {
            log.warn("⚠️ XXL-Job 访问令牌未配置，可能影响安全性");
        }

        // 输出配置信息
        log.info("XXL-Job 配置验证通过:");
        log.info("  ✅ 启用状态: {}", xxlJobProperties.getEnabled());
        log.info("  ✅ 管理中心地址: {}", adminAddresses);
        log.info("  ✅ 执行器应用名: {}", appName);
        log.info("  ✅ 执行器日志路径: {}", logPath);
        log.info("  ✅ 访问令牌: {}", accessToken != null ? "已配置" : "未配置");
        
        // 验证管理中心连接性（可选）
        validateAdminConnection(adminAddresses);
    }

    /**
     * 验证管理中心连接性
     */
    private void validateAdminConnection(String adminAddresses) {
        try {
            // 这里可以添加简单的连接性检查
            // 比如 HTTP 请求检查管理中心是否可访问
            log.info("管理中心地址配置正确: {}", adminAddresses);
            log.info("💡 请确保 XXL-Job 管理中心服务已启动");
        } catch (Exception e) {
            log.warn("⚠️ 无法验证管理中心连接性: {}", e.getMessage());
        }
    }
}
